﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TumbaloSoft.Models;
using IBatisNet.DataMapper;
using TumbaloSoft.Helpers;
using TumbaloSoft.Helpers.QueryObjects;
using System.Collections;

namespace TumbaloSoft.Controllers
{
    public class BalanceEconomicoGeneralController : TumbaloController
    {
        //
        // GET: /BalanceEconomicoEdificio/

        public ActionResult Configurar()
        {
            if (defaultAction != null) return defaultAction;
            
            IList listaedif = HelperEdificio.selectAll();
            ViewBag.listaedif = HelperEdificio.selectAll();
            return View();
        }

        [HttpPost]
        public ActionResult Configurar(BusquedaBalanceEconomicoGeneral busqueda, String tipoReporte)
        {
            if (defaultAction != null) return defaultAction;
            
            if (busqueda.prFecIni != null && busqueda.prFecFin != null && busqueda.prFecFin < busqueda.prFecIni)
            {
                ModelState.AddModelError("prFecIni", "La fecha de inicio debe ser menor que la fecha de fin");
            }
            
            if (ModelState.IsValid && busqueda.prEdificios.Count>0)
            {
                if (tipoReporte.ToUpper() == "HTML")
                {
                    BusquedaBalanceEconomicoGeneral busca2 = new BusquedaBalanceEconomicoGeneral();
                    busca2.prFecFin = busqueda.prFecFin;
                    busca2.prFecIni = busqueda.prFecIni;
                    busca2.prEdificios = new List<Int32>();

                    for (int i = 0; i < busqueda.prEdificios.Count; i++) busca2.prEdificios.Add(busqueda.prEdificios[i]);
                    TempData["busqueda"] = busca2;
                    return RedirectToAction("Visualizar");
                }
                else
                {
                    //TempData["busquedapdf"] = busqueda;
                    String listaedificios = "";
                    for (int i = 0; i < busqueda.prEdificios.Count; i++)
                    {
                        if (i != busqueda.prEdificios.Count - 1)
                            listaedificios = listaedificios + "prEdificios=" + busqueda.prEdificios[i].ToString() + "&";
                        else
                            listaedificios = listaedificios + "prEdificios=" + busqueda.prEdificios[i].ToString();
                    }
                    HelperPDF.HtmlToPDF("BalanceEconomicoGeneral/PDF?" + listaedificios + "&prFecIni=" + busqueda.prFecIni.ToString("MM/dd/yyyy") + "&prFecFin=" + busqueda.prFecFin.ToString("MM/dd/yyyy"), "Balance Economico", 0, this);
                    return RedirectToAction("Configurar");
                }
                    
            }
            else
            {
                IList listaedif = HelperEdificio.selectAll();
                ViewBag.listaedif = HelperEdificio.selectAll();
                return View("Configurar", busqueda);
            }
        }
        public ActionResult Visualizar()
        {
           // double ingresototal = 0, egresototal = 0, saldo = 0;
            if (defaultAction != null) return defaultAction;
            
            BusquedaBalanceEconomicoGeneral busqueda = (BusquedaBalanceEconomicoGeneral)TempData["busqueda"];
            
                IList egresos = HelperGastosComunes.egresostotales(busqueda);
                ViewBag.egresos = egresos; 
                /*foreach (GastosComunes egr in egresos) egresototal += egr.prMonto;*/

                String titulo = "Balance Económico General del: " + busqueda.prFecIni.ToShortDateString() + " al " + busqueda.prFecFin.ToShortDateString();
                
                ViewBag.titulo = titulo;
                

                IList ingresos = HelperBalanceEconomico.ingresostotales(busqueda);
                ViewBag.ingresos = ingresos;
               
                List<LineaIngresosTotales> saldo = new List<LineaIngresosTotales>();
                LineaIngresosTotales linea;

                Double monto = 0;
                for (int i = 0; i < ingresos.Count; i++)
                {
                    monto = 0;
                    linea = new LineaIngresosTotales();
                    linea.prIdEdificio=((LineaIngresosTotales)ingresos[i]).prIdEdificio;
                    linea.prNombre = ((LineaIngresosTotales)ingresos[i]).prNombre;
                    //buscamos monto
                    for (int j = 0; j < egresos.Count; j++)
                    {
                        if (((LineaIngresosTotales)egresos[j]).prIdEdificio==((LineaIngresosTotales)ingresos[i]).prIdEdificio)
                        {
                            monto=((LineaIngresosTotales)egresos[i]).prMonto;
                            break;
                        }
                    }
                    linea.prMonto = ((LineaIngresosTotales)ingresos[i]).prMonto - monto;

                    saldo.Add(linea);
                }
                //saldo ya tiene los edificios con saldo postivo

            //buscamos los edificios con saldo negativo
             for (int i = 0; i < egresos.Count; i++)
             {
                 monto = 0;
                 linea = new LineaIngresosTotales();
                linea.prIdEdificio=((LineaIngresosTotales)egresos[i]).prIdEdificio;
                linea.prNombre = ((LineaIngresosTotales)egresos[i]).prNombre;

                 for (int j=0;j<ingresos.Count;j++)
                     if (((LineaIngresosTotales)egresos[i]).prIdEdificio == ((LineaIngresosTotales)ingresos[j]).prIdEdificio)
                     {
                         //se encontro en ingresos, no entra a saldo ya
                         monto = 1;
                         break;
                     }

                 //verificamos que no este en ingresos
                 if (monto == 0)
                 {
                     linea.prMonto = ((LineaIngresosTotales)egresos[i]).prMonto * -1;
                     saldo.Add(linea);
                 }

             }
                ViewBag.saldo = saldo;
                    //foreach (Cuota igr in ingresos) ingresototal += igr.prMonto;
                    //saldo = ingresototal - egresototal;

                    // ViewBag.ingresototal = ingresototal;
                    // ViewBag.egresototal = egresototal;
                    // ViewBag.saldo = saldo;
                    return View();
                //return reporteToPDF(busqueda);
          
        }

        public ActionResult PDF(BusquedaBalanceEconomicoGeneral busqueda)
        {
            // double ingresototal = 0, egresototal = 0, saldo = 0;
            //BusquedaBalanceEconomicoGeneral busqueda = (BusquedaBalanceEconomicoGeneral)TempData["busquedapdf"];
            //if (defaultAction != null) return defaultAction;


            IList egresos = HelperGastosComunes.egresostotales(busqueda);
            ViewBag.egresos = egresos;
            /*foreach (GastosComunes egr in egresos) egresototal += egr.prMonto;*/

            String titulo = "Balance Económico General del: " + busqueda.prFecIni.ToShortDateString() + " al " + busqueda.prFecFin.ToShortDateString();

            ViewBag.titulo = titulo;


            IList ingresos = HelperBalanceEconomico.ingresostotales(busqueda);
            ViewBag.ingresos = ingresos;

            List<LineaIngresosTotales> saldo = new List<LineaIngresosTotales>();
            LineaIngresosTotales linea;
            Double monto = 0;
            for (int i = 0; i < ingresos.Count; i++)
            {
                monto = 0;
                linea = new LineaIngresosTotales();
                linea.prIdEdificio = ((LineaIngresosTotales)ingresos[i]).prIdEdificio;
                linea.prNombre = ((LineaIngresosTotales)ingresos[i]).prNombre;
                //buscamos monto
                for (int j = 0; j < egresos.Count; j++)
                {
                    if (((LineaIngresosTotales)egresos[j]).prIdEdificio == ((LineaIngresosTotales)ingresos[i]).prIdEdificio)
                    {
                        monto = ((LineaIngresosTotales)egresos[i]).prMonto;
                        break;
                    }
                }
                linea.prMonto = ((LineaIngresosTotales)ingresos[i]).prMonto - monto;

                saldo.Add(linea);
            }
            //saldo ya tiene los edificios con saldo postivo

            //buscamos los edificios con saldo negativo
            for (int i = 0; i < egresos.Count; i++)
            {
                monto = 0;
                linea = new LineaIngresosTotales();
                linea.prIdEdificio = ((LineaIngresosTotales)egresos[i]).prIdEdificio;
                linea.prNombre = ((LineaIngresosTotales)egresos[i]).prNombre;

                for (int j = 0; j < ingresos.Count; j++)
                    if (((LineaIngresosTotales)egresos[i]).prIdEdificio == ((LineaIngresosTotales)ingresos[j]).prIdEdificio)
                    {
                        //se encontro en ingresos, no entra a saldo ya
                        monto = 1;
                        break;
                    }

                //verificamos que no este en ingresos
                if (monto == 0)
                {
                    linea.prMonto = ((LineaIngresosTotales)egresos[i]).prMonto * -1;
                    saldo.Add(linea);
                }

            }
            ViewBag.saldo = saldo;
            //foreach (Cuota igr in ingresos) ingresototal += igr.prMonto;
            //saldo = ingresototal - egresototal;

            // ViewBag.ingresototal = ingresototal;
            // ViewBag.egresototal = egresototal;
            // ViewBag.saldo = saldo;
            return View();
            //return reporteToPDF(busqueda);

        }
    }
}
